﻿using System;
using System.Configuration;
using System.Web.Mvc;
using System.Web.Routing;
using Ninject;
using Ninject.Modules;
using Safal.IncidentTracker.Domain.Abstract;
using Safal.IncidentTracker.Domain.Concrete;

namespace Safal.IncidentTracker.WebUI.Infrastructure {
    public class NinjectControllerFactory : DefaultControllerFactory {

        // A Ninject "kernel" is the thing that can supply object instances
        private IKernel kernel = new StandardKernel(new JobTrackerServices());

        // ASP.NET MVC calls this to get the controller for each request
        protected override IController GetControllerInstance(RequestContext context, Type controllerType)
        {
            if (controllerType == null)
                return null;
            return (IController)kernel.Get(controllerType);
        }

        // Configures how abstract service types are mapped to concrete implementations
        private class JobTrackerServices : NinjectModule
        {
            public override void Load()
            {
                Bind<IIncidentsRepository>()
                    .To<SqlIncidentsRepository>()
                    .WithConstructorArgument("connectionString",
                                             ConfigurationManager.ConnectionStrings["AppDb"].ConnectionString
                    );
            }
        }

    }
}